/**
 * 高阶函数
 */

// 函数作为参数
let arr: number[] = [1, 2, 3, 4, 5, 6]

// 模拟forEach
function forEach<T>(arr: T[], fn: (item: T) => void) {
  for (let i = 0; i < arr.length; i++) {
    fn(arr[i])
  }
}

forEach<number>(arr, console.log)

// 模拟filter
function filter<T>(arr: T[], fn: (item: T) => boolean): T[] {
  let res: T[] = []
  for (let i = 0; i < arr.length; i++) {
    if (fn(arr[i])) {
      res.push(arr[i])
    }
  }
  return res
}

let resArr = filter<number>(arr, n => n % 2 === 0)
console.log(resArr)

// 函数作为参数可以让程序更灵活，调用函数时不需要考虑内部实现细节。
